//
// Created by 麻再挺 on 2021/12/9.
//

#include "hstring.h"
#include <string.h>

/**
 * 生成一个值等于 *tmp 的 HString
 * @param str 字符串
 * @param tmp 字符串
 * @return
 */
Status HString_Assign(HString *str, char *tmp) {
    // 释放原有字符串空间
    if (!str->ch) free(str->ch);
    // 求字符串长度
    unsigned int len = strlen(tmp);
    if (len == 0) str->ch = NULL;
    else {
        // 申请内存
        if (!(str->ch = malloc(len * sizeof(char)))) exit(OVERFLOW);
        // 赋值数据
        str->length = len;
        // 拷贝数据
        strcpy(str->ch, tmp);
    }
    return OK;
}

/**
 * 返回字符串元素个数, 即串的长度
 * @param str 字符串
 * @return
 */
int HString_Length(HString *str) {
    return (int) str->length;
}

/**
 * 字符串比较
 * @param str 字符串 1
 * @param tmp 字符串 2
 * @return 若 str > tmp, 返回值 > 0; 若 str = tmp, 返回值 = 0;  若 str < tmp, 返回值 < 0;
 */
int HString_Compare(HString *str, HString *tmp) {
    return strcmp(str->ch, tmp->ch);
}

/**
 * 将字符串清空, 并释放字符串所占空间
 * @param str 字符串
 * @return
 */
Status HString_Clear(HString *str) {
    if (str->ch) {
        free(str->ch);
        str->ch = NULL;
    }
    str->length = 0;
    return OK;
}

/**
 * 用 tmp 返回 str1 与 str2 拼接完成的字符串
 * @param tmp 新串
 * @param str1 字符串 1
 * @param str2 字符串 2
 * @return
 */
Status HString_Concat(HString *tmp, HString *str1, HString *str2) {
    strcat(tmp->ch, str1->ch);
    strcat(tmp->ch, str2->ch);
    tmp->length = str1->length + str2->length;
    return OK;
}

/**
 * 返回串的第 pos 个字符起的长度为 len 的子串
 * @param str 源串
 * @param pos 起始位置
 * @param len 子串长度
 * @return
 */
Status HString_Substring(HString *str, int pos, int len, HString *subStr) {
    // 校验是否长度是否合法
    if (pos < 1 || pos > str->length || len < 0 || len > str->length - pos + 1) return ERROR;
    // 释放原有空间
    if (!subStr->ch) free(subStr->ch);
    // 空串
    if (!len) {
        subStr->ch = NULL;
        subStr->length = 0;
    } else {
        // 申请空间并赋值
        subStr->ch = malloc(len * sizeof(char));
        for (int i = pos; i < pos + len; ++i) {
            subStr->ch[i - pos] = str->ch[i];
        }
        subStr->length = len;
    }
    return OK;
}

/**
 * 打印字符串
 * @param str 字符串
 * @return
 */
HString HString_Print(HString *str) {
    for (int i = 0; i < str->length; ++i) {
        printf("%c", str->ch[i]);
    }
    printf("\n");
}